package org.example.controller;

import org.example.entity.User;
import org.example.validate.UserGroup;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.groups.Default;

@RestController
public class UserController {

    @PostMapping("/register")
    public String register(@Validated(value = {UserGroup.Register.class}) @RequestBody User user) {
        // 保存用户信息到数据库等操作
        return "注册成功";
    }

    /**
     * 如果控制器上只写了一个Validated注解，但是却没有写具体的UserGroup参数指明使用场景，那么默认就是校验的Default；对应的User实体里面
     * 写@NotBlank(message = "地址不能为空")的时候也不能写groups参数，默认也是Default；那么此控制器接口只校验User实体中没有写groups参数的属性字段
     * 如果控制器上没有写@Validated，那么什么接口什么参数属性都不会校验
     * */
    @PostMapping("/add")
    public String add(@Validated @RequestBody User user) {
        return "增加成功";
    }

    /**
     * 如果控制器方法里面只写UserGroup.Add，那么User里面的属性只有标记了@NotNull(groups = {UserGroup.Add.class}, message = "密码不能为空")的才会被校验，
     * @NotNull(message = "密码不能为空")这样的是不校验的；但是如果控制器方法加上了Default.class，那么对于User实体中的属性@NotNull(message = "密码不能为空")
     * 被前面这样标识的也会被校验，@NotNull(message = "密码不能为空")这样标识的属性默认级别就是Default.class
     * */
    @PostMapping("/add2")
    public String add2(@Validated(value = {UserGroup.Add.class, Default.class}) @RequestBody User user) {
        return "增加成功";
    }
}
